Tengo dos matrices que contienen objetos así:
const array1 = [ { "id": 1, "mass": 149, "height": 180, "dob": "2003-09-04" }, { "id": 2, "mass": 140, "height": 175, "dob": "2000-02-12", }, { "id": 3, "mass": 143, "height": 170, "dob": "2001-11-04" } ] const array2 = [ { "id": 1, "name": "James", "sport": "Football" }, { "id": 2, "name": "Adam", "sport": "Tennis" } ] Me gustaría fusionarlos de manera que una matriz combinada solo contenga datos donde la id aparece tanto en la matriz1 como en la matriz2.
Hasta ahora estoy usando lodash _.merge que devuelve:
const merged = _.merge(array1, array2) merged = [ { "id": 1, "mass": 149, "height": 180, "dob": "2003-09-04", "name": "James", "sport": "Football" }, { "id": 2, "mass": 140, "height": 175, "dob": "2000-02-12", "name": "Adam", "sport": "Tennis" }, { "id": 3, "mass": 143, "height": 170, "dob": "2001-11-04" , } ] Me gustaría merged para contener datos donde la id aparece en ambos, es decir:
[{ "id": 1, "mass": 149, "height": 180, "dob": "2003-09-04", "name": "James", "sport": "Football" }, { "id": 2, "mass": 140, "height": 175, "dob": "2000-02-12", "name": "Adam", "sport": "Tennis" }]Creo que la función equivalente en algo como SQL sería una "unión interna"
¡Cualquier ayuda sería muy apreciada!
Necesita mapearlos de uno a otro. Idea básica usando reduce donde rastreamos el artículo por la identificación.
const array1 = [{ "id": 1, "mass": 149, "height": 180, "dob": '2003-09-04' }, { "id": 2, "mass": 140, "height": 175, "dob": '2000-02-12', }, { "id": 3, "mass": 143, "height": 170, "dob": '2001-11-04' } ] const array2 = [{ "id": 1, "name": "James", "sport": "Football" }, { "id": 2, "name": "Adam", "sport": "Tennis" } ] const result = Object.values([...array1, ...array2].reduce((acc, userData) => { // have you seen the id before? If yes, use it, if no use and empty object const data = acc[userData.id] || {}; //merge the objects together and store the updated data by the id acc[userData.id] = { ...data, ...userData }; return acc }, {})); console.log(result);Ahora eso incluirá todo. Si solo desea los elementos que están en ambos, puede hacerlo en dos bucles.
const array1 = [{ "id": 1, "mass": 149, "height": 180, "dob": '2003-09-04' }, { "id": 2, "mass": 140, "height": 175, "dob": '2000-02-12', }, { "id": 3, "mass": 143, "height": 170, "dob": '2001-11-04' } ] const array2 = [{ "id": 1, "name": "James", "sport": "Football" }, { "id": 2, "name": "Adam", "sport": "Tennis" } ] // create a look up by the id const array1MappedById = array1.reduce((acc, userData) => { acc[userData.id] = userData; return acc }, {}); // Loop over the second array and make a new array with the merged data const result = array2.reduce((arr, userData) => { const array1Data = array1MappedById[userData.id]; // if the data exists in the map, then we should merge the data if (array1Data) { arr.push({...array1Data, ...userData}); } return arr; }, []); console.log(result);Puede filtrar su primera matriz con Array.filter para incluir solo los objetos que están presentes en su segunda matriz antes de realizar la misma combinación.
let merged = array1.filter(e => array2.some(f => f.id == e.id)); const array1 = [ { "id": 1, "mass": 149, "height": 180, "dob": 2003-09-04 }, { "id": 2, "mass": 140, "height": 175, "dob": 2000-02-12, }, { "id": 3, "mass": 143, "height": 170, "dob": 2001-11-04 } ] const array2 = [ { "id": 1, "name": "James", "sport": "Football" }, { "id": 2, "name": "Adam", "sport": "Tennis" } ] let merged = array1.filter(e => array2.some(f => f.id == e.id)); merged = _.merge(merged, array2); console.log(merged); <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>esto fusionará los datos donde la identificación es la misma identificación
const merged = array2.reduce((arr, current) => { let array1Data = {...array1}[current.id]; if (array1Data) { arr.push({...array1Data, ...current}); } return arr; }, []); console.log(merged);